﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Collections;
using System.Text.RegularExpressions;

namespace Jurassic_Island
{
    public partial class FormCaminos : Form
    {
        private DataSet dsCaminos;
        private String exprBuscar = @"^[a-zA-Z0-9ñÑ ]*$";
        private ENLugares enLug = new ENLugares();
        private ENCaminos enCam = new ENCaminos();
        private ErrorProvider epOrigen;
        private ErrorProvider epDestino;
        private ErrorProvider epCoste;
        private bool editMode = false;
        private string exprCoste = @"^[0-9]+([,][0-9]{2})?$";

        public FormCaminos()
        {
            InitializeComponent();
        }

        private void RefrescarGrid()
        {
            try
            {
                dsCaminos = enCam.ObtenerListaCaminos();

                dgvCaminos.DataSource = dsCaminos;
                dgvCaminos.DataMember = "Caminos";

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void RefrescarGridConBusqueda(String busca)
        {
            try
            {
                ENCaminos enCam = new ENCaminos();
                dsCaminos = new DataSet();

                if (tbBuscar.TextLength > 0)
                    //Provisional. Si puedo añadiré un combobox para seleccionar el campo a buscar
                    dsCaminos = enCam.ObtenerListaCaminosPorLugar(busca);
                else
                    dsCaminos = enCam.ObtenerListaCaminos();

                dgvCaminos.DataSource = dsCaminos;
                dgvCaminos.DataMember = "Caminos";

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void FormCaminos_Load(object sender, EventArgs e)
        {
            try
            {
                ENCaminos enCam = new ENCaminos();
                dsCaminos = new DataSet();

                DataSet dsLugares = enLug.ObtenerNombresLugares();
                foreach (DataRow dr in dsLugares.Tables[0].Rows)
                {
                    cbOrigen.Items.AddRange(dr.ItemArray);
                    cbDestino.Items.AddRange(dr.ItemArray);
                }

                RefrescarGrid();

                epOrigen = new ErrorProvider();
                epOrigen.SetIconAlignment(cbOrigen, ErrorIconAlignment.MiddleRight);
                epOrigen.SetIconPadding(cbOrigen, 2);
                epOrigen.BlinkStyle = ErrorBlinkStyle.BlinkIfDifferentError;

                epDestino = new ErrorProvider();
                epDestino.SetIconAlignment(cbDestino, ErrorIconAlignment.MiddleRight);
                epDestino.SetIconPadding(cbDestino, 2);
                epDestino.BlinkStyle = ErrorBlinkStyle.BlinkIfDifferentError;

                epCoste = new ErrorProvider();
                epCoste.SetIconAlignment(tbCoste, ErrorIconAlignment.MiddleRight);
                epCoste.SetIconPadding(tbCoste, 2);
                epCoste.BlinkStyle = ErrorBlinkStyle.BlinkIfDifferentError;

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void btCerrar_Click(object sender, EventArgs e)
        {
            Close();
            Dispose();
        }

        private void btInsertar_Click(object sender, EventArgs e)
        {
            try
            {
                if (ValidarCampos())
                {
                    try
                    {
                        enCam.Origen = cbOrigen.Text;
                        enCam.Destino = cbDestino.Text;
                        enCam.Coste = int.Parse(tbCoste.Text);

                        if (editMode)
                        {
                            enCam.ID = int.Parse(tbID.Text);
                        }

                        if (enCam.InsertarCamino(editMode))
                        {
                            if (editMode)
                            {
                                MessageBox.Show("Camino editado correctamente", "Éxito al editar", MessageBoxButtons.OK, MessageBoxIcon.Information);
                                tbID.Text = "";
                                tbCoste.Text = "";
                                editMode = false;
                            }

                            else
                                MessageBox.Show("Camino insertado correctamente", "Éxito al insertar", MessageBoxButtons.OK, MessageBoxIcon.Information);
                            this.DialogResult = DialogResult.OK;

                            RefrescarGrid();
                        }
                        else
                            MessageBox.Show("Error, no se ha podido insertar el camino", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message, "Error");
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }


        private bool ValidarCampos()
        {
            bool correcto = true;

            try
            {
                string errores = "Corrige los siguientes errores:\n";

                if (cbOrigen.Text == "")
                {
                    correcto = false;
                    errores += "-Selecciona un origen\n";
                    epOrigen.SetError(cbOrigen, "Selecciona un origen");
                }
                else
                    epOrigen.SetError(cbOrigen, null);

                if (cbDestino.Text == "")
                {
                    correcto = false;
                    errores += "-Selecciona un destino\n";
                    epDestino.SetError(cbDestino, "Selecciona un destino");
                }
                else
                    epDestino.SetError(cbDestino, null);

                try
                {
                    if (!Regex.Match(tbCoste.Text, exprCoste).Success)
                    {
                        correcto = false;
                        errores += "-Introduce un coste correcto (número real)\n";
                        epCoste.SetError(tbCoste, "Introduce un coste correcto (número real)");
                    }

                    else
                        epCoste.SetError(tbCoste, null);
                }
                catch (FormatException fEx)
                {
                    MessageBox.Show(fEx.Message, "Error de formato", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }

                if (!correcto)
                {
                    throw new Exception(errores);
                }

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

            return correcto;
        }

        private void dgvCaminos_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            
        }

        private void btBorrar_Click(object sender, EventArgs e)
        {
            bool cancelar = false;
            foreach (DataGridViewRow dgvr in dgvCaminos.SelectedRows)
            {
                if (!cancelar)
                {
                    switch (MessageBox.Show("¿Borrar el camino (ID=" + dgvr.Cells[0].Value.ToString() + ")?","Borrar camino",MessageBoxButtons.YesNoCancel,MessageBoxIcon.Exclamation))
                    {
                        case DialogResult.Yes:
                                ENCaminos enCamino = new ENCaminos();
                                enCamino.ID = int.Parse(dgvr.Cells[0].Value.ToString());
                                enCamino.Origen = dgvr.Cells[1].Value.ToString();
                                enCamino.Destino = dgvr.Cells[2].Value.ToString();
                                enCamino.Coste = int.Parse(dgvr.Cells[3].Value.ToString());
                                enCamino.EliminarCamino();
                            break;
                        case DialogResult.No:
                            break;
                        case DialogResult.Cancel:
                                cancelar = true;
                            break;
                    }
                }
                
            }

            RefrescarGrid();

        }

        private void btEditar_Click(object sender, EventArgs e)
        {
            if (dgvCaminos.RowCount > 0)
            {
                tbID.Text = dgvCaminos["ID", dgvCaminos.CurrentRow.Index].Value.ToString();
                cbOrigen.Text = dgvCaminos["Origen", dgvCaminos.CurrentRow.Index].Value.ToString();
                cbDestino.Text = dgvCaminos["Destino", dgvCaminos.CurrentRow.Index].Value.ToString();
                tbCoste.Text = dgvCaminos["Coste", dgvCaminos.CurrentRow.Index].Value.ToString();

                editMode = true;
                if (editMode)
                {
                    ENCaminos enCamino = new ENCaminos();

                    foreach (DataGridViewRow dgvr in dgvCaminos.SelectedRows)
                    {

                    }
                    RefrescarGrid();
                }
            }
        }

        private void tbBuscar_TextChanged(object sender, EventArgs e)
        {
            if (!Regex.IsMatch(tbBuscar.Text, exprBuscar))
            {
                epCaminos.SetError(tbBuscar, "Introduzca un texto válido.");
            }
            else
            {
                epCaminos.SetError(tbBuscar, "");
            }
        }

        private void tbBuscar_DoubleClick(object sender, EventArgs e)
        {
            tbBuscar.Text = "";
        }

        private void btBuscar_Click(object sender, EventArgs e)
        {
            if (!Regex.IsMatch(tbBuscar.Text, exprBuscar))
            {
                epCaminos.SetError(tbBuscar, "Introduzca un texto válido.");
            }
            else
            {
                RefrescarGridConBusqueda(tbBuscar.Text);
                epCaminos.SetError(tbBuscar, "");
            }
            
        }

        private void buscarToolStripMenuItem_Click(object sender, EventArgs e)
        {

        }

        private void tbCoste_TextChanged(object sender, EventArgs e)
        {
            if (!Regex.IsMatch(tbCoste.Text, exprCoste))
            {
                epCoste.SetError(tbCoste, "Introduce un coste correcto (número real).");
            }
            else
            {
                epCoste.SetError(tbCoste, "");
            }

        }
    }
}
